home *** CD-ROM | disk | FTP | other *** search
/ ShareWare OnLine 2 / ShareWare OnLine Volume 2 (CMS Software)(1993).iso / os2 / elvis172.zip / wildcard.c < prev   
C/C++ Source or Header  |  1993-03-28  |  4KB  |  198 lines

  1. /* wildcard.c */
  2.  
  3. /* Author:
  4.  *    Guntram Blohm
  5.  *    Buchenstrasse 19
  6.  *    7904 Erbach, West Germany
  7.  *    Tel. ++49-7305-6997
  8.  *    sorry - no regular network connection
  9.  */
  10.  
  11. /* this program implements wildcard expansion for elvis/dos. It works
  12.  * like UNIX echo, but uses the dos wildcard conventions
  13.  * (*.* matches all files, * matches files without extension only,
  14.  * filespecs may contain drive letters, wildcards not allowed in directory
  15.  * names).
  16.  *
  17.  * It is also #included into ctags.c, ref.c, ...; in this case,
  18.  * we don't want a main function here.
  19.  */
  20.  
  21. #include <stdio.h>
  22. #ifdef __STDC__
  23. # include <stdlib.h>
  24. #endif
  25. #ifndef    WILDCARD_NO_MAIN
  26. # include "config.h"
  27. #endif
  28. #ifdef    __TURBOC__
  29. #include <dir.h>
  30. #endif
  31.  
  32. /* We include ctype.c here (instead of including just ctype.h and linking
  33.  * with ctype.o) because on some systems ctype.o will have been compiled in
  34.  * "large model" and the wildcard program is to be compiled in "small model" 
  35.  * You can't mix models.  By including ctype.c here, we can avoid linking
  36.  * with ctype.o.
  37.  *
  38.  * HOWEVER, if WILDCARD_NO_MAIN is defined then wildcard.c is itself being
  39.  * included in another .c file, which has either already included ctypes.c or
  40.  * will be linked with ctypes.o, so in this instance we include just ctypos.h.
  41.  */
  42. #ifdef WILDCARD_NO_MAIN
  43. # include "ctype.h"
  44. #else
  45. # include "ctype.c"
  46. #endif
  47.  
  48. #ifdef    M_I86
  49. #define    findfirst(a,b,c)    _dos_findfirst(a,c,b)
  50. #define    findnext        _dos_findnext
  51. #define    ffblk            find_t
  52. #define    ff_name            name
  53. #include <dos.h>
  54. #endif
  55.  
  56. /* Atari TOS, MWC */
  57. #ifdef M68000
  58. #include <stat.h>
  59. #include <osbind.h>
  60. #define    findfirst(a,b,c)    (Fsetdta(b), (Fsfirst(a,c)))
  61. #define    findnext(x)        (Fsnext())
  62. #define    ff_name    d_fname
  63. #endif
  64.  
  65. /* Atari TOS, GNU-C */
  66. #ifdef __m68k__
  67. #include <stat.h>
  68. #include <osbind.h>
  69. #define    findfirst(a,b,c)    (Fsetdta(b), (Fsfirst(a,c)))
  70. #define    findnext(x)        (Fsnext())
  71. #define    ff_name    dta_name
  72. #define    DMABUFFER struct _dta
  73. #endif
  74.  
  75. #ifdef OS2
  76. #define size_t xxx_size_t
  77. #include <sys/emx.h>
  78. #undef size_t
  79. #define    findfirst(a,b,c)    __findfirst(a,c,b)
  80. #define    findnext        __findnext
  81. #define    ffblk            _find
  82. #define    ff_name            name
  83. #endif
  84.  
  85. #define    MAXFILES    1000
  86.  
  87. int pstrcmp();
  88. #ifndef __STDC__
  89. extern char *calloc();
  90. #endif
  91.  
  92. char *files[MAXFILES];
  93. int nfiles;
  94.  
  95. #ifndef    WILDCARD_NO_MAIN
  96.  
  97. main(argc, argv)
  98.     char **argv;
  99. {
  100.     int i;
  101.  
  102.     _ct_init("");
  103.     for (i=1; i<argc; i++)
  104.         expand(argv[i]);
  105.     if (nfiles)
  106.         printf("%s", files[0]);
  107.     for (i=1; i<nfiles; i++)
  108.     {
  109.         printf(" %s", files[i]);
  110.     }
  111.     putchar('\n');
  112.     return 0;
  113. }
  114.  
  115. #else
  116. char **wildexpand(argc, argv)
  117.     int *argc;
  118.     char **argv;
  119. {
  120.     int i;
  121.     
  122.     for (i=0; i<*argc; i++)
  123.         expand(argv[i]);
  124.     *argc=nfiles;
  125.     return files;
  126. }    
  127. #endif
  128.  
  129. expand(name)
  130.     char *name;
  131. {
  132.     char *filespec;
  133.     int wildcard=0;
  134. #if defined(M68000) || defined(__m68k__)
  135.     DMABUFFER findbuf;
  136. #else
  137.     struct ffblk findbuf;
  138. #endif
  139.     int err;
  140.     char buf[80];
  141.     int lastn;
  142.  
  143.     strcpy(buf, name);
  144.     for (filespec=buf; *filespec; filespec++)
  145.         ;
  146.  
  147.     while (--filespec>=buf)
  148.     {    if (*filespec=='?' || *filespec=='*')
  149.             wildcard=1;
  150.         if (*filespec=='/' || *filespec=='\\' || *filespec==':')
  151.             break;
  152.     }
  153.     if (!wildcard)
  154.         addfile(buf);
  155.     else
  156.     {
  157.         lastn=nfiles;
  158.         filespec++;
  159.         if ((err=findfirst(buf, &findbuf, 0))!=0)
  160.             addfile(buf);
  161.         while (!err)
  162.         {
  163.             strcpy(filespec, findbuf.ff_name);
  164.             addfile(buf);
  165.             err=findnext(&findbuf);
  166.         }
  167.         if (lastn!=nfiles)
  168.             qsort(files+lastn, nfiles-lastn, sizeof(char *), pstrcmp);
  169.     }
  170. }
  171.  
  172. #if MINT
  173. extern int __mint;
  174. #endif
  175. addfile(buf)
  176.     char *buf;
  177. {
  178.     char *p;
  179.  
  180. #if MINT
  181.     /* there are filesystems on MiNT that are case sensitive... and for
  182.      * the vanilla GEMDOS fs MiNT already does this conversion itself.
  183.      */
  184.     if (!__mint)
  185. #endif
  186.     for (p=buf; *p; p++)
  187.         *p=tolower(*p);
  188.  
  189.     if (nfiles<MAXFILES && (files[nfiles]=calloc(strlen(buf)+1, 1))!=0)
  190.         strcpy(files[nfiles++], buf);
  191. }
  192.  
  193. int pstrcmp(a, b)
  194.     char **a, **b;
  195. {
  196.     return strcmp(*a, *b);
  197. }
  198.